package com.huitone.smspfm.socket.protocol.sgip.message.msghead;

import com.bin.common.utils.ArrayUtils;
import com.huitone.smspfm.socket.protocol.sgip.conversion.TransferConverter;
import com.huitone.smspfm.socket.protocol.sgip.message.IMessage;

/**   
* @Title Head.java 
* @Package com.huitone.smspfm.socket.protocol.sgip.msghead 
* @Description TODO(用一句话描述该文件做什么) 
* @author ybliang   
* @date 2017年3月23日 下午2:05:41 
* @version V1.0   
*/
public class Head implements IHead, IMessage {
	
	public static final int HEAD_LENGTH = 20;
	
	/**
	 * @字节长度 4
	 * @数据类型 Integer
	 * @DESC
	 *  消息的总长度(字节)
	 */
	private byte[] messageLength = new byte[4];
	
	/**
	 * @字节长度 4
	 * @数据类型 Integer
	 * @DESC
	 *  命令ID
	 */
	private byte[] commandID = new byte[4];
	
	/**
	 * @字节长度 4
	 * @数据类型 Integer
	 * @DESC
	 *  serialNo的第1段
	 */
	private byte[] serialNoPart1 = new byte[4];
	
	/**
	 * @字节长度 4
	 * @数据类型 Integer
	 * @DESC
	 *  serialNo的第2段
	 */
	private byte[] serialNoPart2 = new byte[4];
	
	/**
	 * @字节长度 4
	 * @数据类型 Integer
	 * @DESC
	 *  serialNo的第3段
	 */
	private byte[] serialNoPart3 = new byte[4];
	
	/**
	 * @字节长度 12
	 * @数据类型 Integer
	 * @DESC
	 *  serialNo由serialNoPart1,serialNoPart2,serialNoPart3三部分组成序列号
	 */
	//private byte[] serialNo = new byte[12];
	
	private byte[] head = null;
	
	
	/**
	 * 根据byte数组创建消息头,消息头长度为20个字节
	 * @param bytes 由messageLength, commandID, serialNoPart1, serialNoPart2, serialNoPart3五部分组成, 每一部分为4个字节
	 * @return Head对象
	 */
	public static Head build(byte[] bytes) {
		
		Head head = new Head();
		
		int index = 0;
		
		head.messageLength = ArrayUtils.subarray(bytes, index, index += 4);
		head.commandID = ArrayUtils.subarray(bytes, index, index += 4);
		head.serialNoPart1 = ArrayUtils.subarray(bytes, index, index += 4);
		head.serialNoPart2 = ArrayUtils.subarray(bytes, index, index += 4);
		head.serialNoPart3 = ArrayUtils.subarray(bytes, index, index += 4);
		
		return head;
	}
	
	/**
	 * 创建消息头
	 * @param bodyLength 消息体长度
	 * @param commandID 命令ID
	 * @param serialNoPart1 源节点编号
	 * @param serialNoPart2 时间MMddHHmmss
	 * @param serialNoPart3 序号
	 * @return
	 */
	public static Head build(int bodyLength, long commandID, long serialNoPart1, long serialNoPart2, long serialNoPart3) {
		
		Head head = new Head();
		
		head.setMessageLength(HEAD_LENGTH + bodyLength);
		head.setCommandID(commandID);
		head.setSerialNoPart1(serialNoPart1);
		head.setSerialNoPart2(serialNoPart2);
		head.setSerialNoPart3(serialNoPart3);
		
		return head;
	}
	
	/**
	 * 创建消息头
	 * @param bodyLength 消息体长度
	 * @param commandID 命令ID
	 * @param serialNoPart1 源节点编号
	 * @param serialNoPart2 时间MMddHHmmss
	 * @param serialNoPart3 序号
	 * @return
	 */
	public static Head build(int bodyLength, long serialNoPart1, long serialNoPart2, long serialNoPart3) {
		
		Head head = new Head();
		
		head.setMessageLength(HEAD_LENGTH + bodyLength);
		head.setSerialNoPart1(serialNoPart1);
		head.setSerialNoPart2(serialNoPart2);
		head.setSerialNoPart3(serialNoPart3);
		
		return head;
	}
	
	
	public int length() {
		return HEAD_LENGTH;
	}
	
	
	public byte[] toByteArray() {
		
		if (head == null) {
			head = ArrayUtils.addAll(messageLength, commandID, serialNoPart1, serialNoPart2, serialNoPart3);
		}
		
		return head;
	}

	
	public String toString() {
		return "Head [序列号=" + getSerialNo() + ", 命令ID=" + getCommandID() + ", 消息长度:" + getMessageLength() + "]";
	}
	
	
	public String toSimpleString() {
		return getSerialNo();
	}

	public long getSerialNoPart1() {
		return TransferConverter.bE2Long(serialNoPart1, 4);
	}

	private void setSerialNoPart1(long serialNoPart1) {
		this.serialNoPart1 = TransferConverter.toBE4(serialNoPart1);
	}

	public long getSerialNoPart2() {
		return TransferConverter.bE2Long(serialNoPart2, 4);
	}

	private void setSerialNoPart2(long serialNoPart2) {
		this.serialNoPart2 = TransferConverter.toBE4(serialNoPart2);
	}

	public long getSerialNoPart3() {
		return TransferConverter.bE2Long(serialNoPart3, 4);
	}

	private void setSerialNoPart3(long serialNoPart3) {
		this.serialNoPart3 = TransferConverter.toBE4(serialNoPart3);
	}

	public String getSerialNo() {
		
		StringBuffer buffer = new StringBuffer();
		
		buffer.append(getSerialNoPart1());
		buffer.append(getSerialNoPart2());
		buffer.append(getSerialNoPart3());
		
		return buffer.toString();
	}

	public int getMessageLength() {
		return TransferConverter.bE2Int4(messageLength);
	}

	private void setMessageLength(int messageLength) {
		this.messageLength = TransferConverter.toBE4(messageLength);
	}

	public long getCommandID() {
		return TransferConverter.bE2Long(commandID, 4);
	}

	public void setCommandID(long commandID) {
		this.commandID = TransferConverter.toBE4(commandID);
	}
}
